/*  看数据范围明显超过long long。我们考虑是否可以在计算中进行mod。
*   每一个正整数可以唯一表示为若干指数不重复的2的次幂的和。
    下面开始小括号()里的都是二进制。
    比如 b = (11001)=(10000+1000+1) = 1*2^4 + 1*2^3 + 0*2^2+ 0*2^1 + 1*2^0
    所以我们可以把b写成二进制，然后分解成2的次幂的和。
    那么a^b = a^(10000) * a^(1000) * a^(1),是不是就是快速幂了。
    举个例子：3^5 = 3^(101) = [1*3^(100)] * [0*3^(10)] * [1*3^(1)]
    对于每个部分[1*3^(100)],1表示b当前这一位，3^(100)表示当前这一位的权值，
    我们定义最开始这个权值为k = 3^1,那么下一次的时候k = k*k = 3^(1) * 3^(1)=3^(10)
    所以我们看b这一位不为0，那就就把这个权值k乘到res结果中。
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b,p;
ll qmi(ll a,ll b, ll p) {
    ll res = 1, k = a % p;
    while(b) { //每次把b的最后一位去掉，遍历b的每一位
        if(b&1) {//如果b的最低位是1
            res *= k; //将该位的权值乘到结果中
            res %= p; //得到的结果要%p保证每次res不超范围
        }
        //去掉b的最低位
        b = (b >> 1);
        // 更新下一位的权值
        k = k * k;
        k %= p;
    }
    return res;
}
int main() {
    cin >> a >> b >> p;

    ll ans = qmi(a,b,p);
    
    printf("%lld^%lld mod %lld=%lld",a,b,p,ans);
    return 0;
}